package queue;

import java.util.PriorityQueue;
import java.util.Queue;
import java.util.concurrent.*;

/**
 * 学习阻塞队列
 * 
 * 使用 Condition 的等待通知
 * 可以做生产者消费者模式
 * 
 * 处理: 抛异常  返回值 一直阻塞  超时退出
 * 入队: add     offer  put     offer(e, nanos)
 * 出队: remove  poll   take    poll(nanos)
 * 首部: element peek   
 * 
 * @author insight
 * @since 2021/9/24
 */
public class BQTest {
    public static void main(String[] args) {
        // 数组 有界 出入一把锁
        Queue<Integer> arrQueue = new ArrayBlockingQueue<>(8);
        // 链表 有界 出入两把锁 并发度更高
        Queue<Integer> linkQueue = new LinkedBlockingQueue<>();
        // 数组 无界 指定比较器来判断优先级 相同优先级无法保证顺序
        Queue<Integer> priority = new PriorityQueue<>((a, b) -> (b - a));
        // 底层使用 PriorityQueue 支持延时获取
        // 需要实现Delay接口 参考 ScheduledFutureTask
        // Queue<FutureTask<Integer>> delay = new DelayQueue<>();
        // SynchronousQueue 无需空间 来一个拿一个
        // LinkedBlockingDeque 无界 双端
        // LinkedTransferQueue 如果有消费者在等 直接给 少了一层操作
    }
    
}